package com.ry.bhwktapp.home.ui

// TODO kt语言中let内置函数的使用
fun main() {
    //普通方式对一个元素相加
    val listOf = listOf(6, 12, 45, 97)
    val first = listOf.first()
    val i = first + first
    println(i)

    //let方式实现相加
    val let = listOf.let {
        listOf.first() + listOf.first()
    }
    println(let)

    //let方式实现判断
    val let1 = listOf.let {
        // it==listOf  let的特点是最后一行是返回值（Int、Booean、Double），区别于前面学的apply （永远返回自己）
        listOf.first()>8
    }
    println(let1)

//    普通方式
    println(getM02(null))
    println(getM01("杨振宁"))

    //let方式
val kkStr = null
    val let2 = kkStr.let {
        if (it == null) "原来你是null,你在搞锤子啊" else "欢迎你$it"
    }
    println(let2)

    val m03 = getM03("孙悟空")
    println(m03)
    println(getM04(null))

    //TODO  run函数的使用
    val runStr = "我是 run字符串"
    val run = runStr.run {
        this.length>12
        "ssjjsjsj"
    }
    println(run)

}

//普通方式判断并返回
fun getM01(va:String?):String{
    return if (va==null) "原来你是null,你在搞锤子啊" else "欢迎你$va"
}

//普通方式判断并返回 简化版
fun getM02(va:String?) = if (va==null) "原来你是null,你在搞锤子啊" else "欢迎你$va"


//let+空合并操作符 方式判断并返回
fun getM03(va:String?):String{
    return va?.let {
      "欢迎你$it"
    }?: "原来你是null,你在搞锤子啊"
}

//let+空合并操作符 方式判断并返回  简化写法
fun getM04(va:String?) = va?.let { "欢迎你$it" }?: "原来你是null,你在搞锤子啊"


/**
 * 内置函数总结：
 * apply：
 * 1、返回类型 都是本身xx.apply 就是xx
 * 2、匿名函数里面持有的是this ==本身
 *
 * let:
 * 1、匿名函数返回类型 都是{内最后一行} 会根据类型推导
 * 2、匿名函数持有的是it ==集合本身
 *
 * run:函数兼有appLy 和let函数的特点
 * 1、匿名函数返回类型 都是{内最后一行} 会根据类型推导
 * 2、匿名函数持有的是this ==xxx.run （this=xxx）
 */
